home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / util / sys / 2b_mv_os2_src.lha / MultiView Src / mv_xfd.e < prev   
Encoding:
Text File  |  1999-03-25  |  2.6 KB  |  139 lines

  1. OPT MODULE, REG = 5
  2. OPT EXPORT
  3.  
  4. MODULE  '*mv_consts', 'exec/memory',
  5.         'dos/dos',    'dos/datetime',
  6.         'xfdmaster',  'libraries/xfdmaster'
  7.  
  8.  
  9. PROC unpack(filename,textlist) HANDLE
  10.  
  11. DEF bufinf  : PTR TO xfdbufferinfo,
  12.     status  = TRUE,
  13.     succ    = FALSE,
  14.     mem     = FALSE,
  15.     len     = FALSE,
  16.     mem2    = FALSE,
  17.     len2    = FALSE
  18.  
  19.   xfdmasterbase := OpenLibrary('xfdmaster.library',38)
  20.  
  21.   IF xfdmasterbase
  22.     bufinf := XfdAllocObject(XFDOBJ_BUFFERINFO)
  23.     IF bufinf
  24.       mem,len  := readfile(filename,textlist)
  25.       bufinf.sourcebuffer := mem
  26.       bufinf.sourcebuflen := len
  27.       IF XfdRecogBuffer(bufinf)
  28.         IF (bufinf.packerflags AND (XFDPFF_PASSWORD OR XFDPFF_KEY16 OR XFDPFF_KEY32))
  29.           Raise(ERR_PASS_KEY)
  30.         ENDIF
  31.         bufinf.targetbufmemtype := MEMF_PUBLIC
  32.         IF XfdDecrunchBuffer(bufinf)
  33.           len2 := bufinf.targetbufsavelen
  34.           mem2 := bufinf.targetbuffer
  35.           StringF(filename,'T:MultiView_tmp_\d',Abs(time()))
  36.           writefile(filename,mem2,len2,textlist)
  37.         ELSE
  38.           Raise(ERR_NO_DECRUNCH)
  39.         ENDIF
  40.       ELSE
  41.         status := FALSE
  42.         mem    := FALSE
  43.       ENDIF
  44.     ELSE
  45.       Raise(ERR_ALLOC)
  46.     ENDIF
  47.   ELSE
  48.     bufinf := FALSE
  49.     Raise(ERR_NO_XFD)
  50.   ENDIF
  51.  
  52. EXCEPT DO
  53.  
  54.   IF mem           THEN Dispose(mem)
  55.   IF mem2          THEN FreeMem(mem2,len2)
  56.   IF bufinf        THEN XfdFreeObject(bufinf)
  57.   IF xfdmasterbase THEN CloseLibrary(xfdmasterbase)
  58.  
  59.   IF exception
  60.     status := FALSE
  61.     SELECT exception
  62.       CASE ERR_EXIT
  63.         RETURN
  64.       DEFAULT
  65.       IF exception < 19
  66.         request(textlist[MSG_INFO_TITLE],textlist[exception])
  67.       ELSE
  68.         request(textlist[MSG_INFO_TITLE],textlist[ERR_UNKNOWN])
  69.       ENDIF
  70.     ENDSELECT
  71.   ENDIF
  72.  
  73. ENDPROC status
  74.  
  75. PROC time()
  76.  
  77. DEF dt : datetime,
  78.     ds : PTR TO datestamp
  79.  
  80.   ds := DateStamp(dt.stamp)
  81.  
  82. ENDPROC ds.days*ds.minute*ds.tick
  83. PROC readfile(filename : PTR TO CHAR, textlist) HANDLE
  84.  
  85. DEF file,
  86.     len,
  87.     mem
  88.  
  89.   file := Open(filename,OLDFILE)
  90.   IF file
  91.     Seek(file,NIL,OFFSET_END)
  92.     len := Seek(file,NIL,OFFSET_BEGINNING)
  93.     mem := New(len)
  94.     IF mem
  95.       Read(file,mem,len)
  96.     ELSE
  97.       Raise(ERR_NO_MEM)
  98.     ENDIF
  99.   ELSE
  100.     Raise(ERR_OPEN)
  101.   ENDIF
  102.  
  103. EXCEPT DO
  104.  
  105.   IF file THEN Close(file)
  106.  
  107.   IF exception
  108.     mem := NIL
  109.     len := NIL
  110.     ReThrow()
  111.   ENDIF
  112.  
  113. ENDPROC mem,len
  114. PROC writefile(filename : PTR TO CHAR, mem, len, textlist) HANDLE
  115.  
  116. DEF ilosc,
  117.     file
  118.  
  119.   file := Open(filename,NEWFILE)
  120.   IF file
  121.     ilosc := Write(file,mem,len)
  122.     IF ilosc <> len
  123.       Raise(ERR_SAVE)
  124.     ENDIF
  125.   ELSE
  126.     Raise(ERR_OPEN)
  127.   ENDIF
  128.  
  129. EXCEPT DO
  130.  
  131.   IF file THEN Close(file)
  132.   IF exception
  133.     ReThrow()
  134.   ENDIF
  135.  
  136. ENDPROC
  137.  
  138.  
  139.